/*
    EHWIF.C

Started by DavidW, 5/12/91

Edit box extension to h layer of hwif

*/

#include <edit.g>
#include <edwin.g>
#include <scrimg.g>
#include <hwif.g>
#include <hwif.h>

GLDEF_D UWORD _ebControlFormat=FALSE;

#define EebH ((PR_EDWIN *)ebH)


#pragma save,ENTER_CALL

LOCAL_C INT DoEntersend(VOID *ebH,INT method,VOID *p1,VOID *p2,VOID *p3)
    {
    p_send5(ebH,method,p1,p2,p3);
    return(0);
    }
    
#pragma restore

LOCAL_C INT Entersend(VOID *ebH,INT method,VOID *p1,VOID *p2,VOID *p3)
    {
    INT ret;

    ret=p_enter6(DoEntersend,ebH,method,p1,p2,p3);
    if (ret<-1)
        uErrorValue(ret);
    return(ret);
    }

#define V (VOID*)

GLDEF_C INT hEBCompleteFormat(VOID *ebH)
    {
    PR_SCRIMG *scrimg;
    INT ret;

    scrimg=EebH->edwin.scrimg;
    if (!scrimg->scrimg.formatting)
        return(0);
    ret=Entersend(scrimg,O_SI_SET,0,0,0);
    p_send2(scrimg->scrimg.wrap,O_AO_CANCEL);
    return(ret);
    }

GLDEF_C INT hEBHandleKey(VOID *ebH,INT keycode,INT modifier)
    {
    INT ret;

    if (keycode==W_KEY_RETURN)
        modifier|=W_SHIFT_MODIFIER;
    ret=Entersend(ebH,O_WN_KEY,V keycode,V modifier,NULL);
    if (!ret && !_ebControlFormat)
        ret=hEBCompleteFormat(ebH);
    return(ret);
    }
    
GLDEF_C VOID hEBClose(VOID *ebH)
    {
    p_send2(ebH,O_DESTROY);
    }

GLDEF_C TEXT *hEBSenseText(VOID *ebH)
    {
    SE_EDWIN sense;

    p_send3(ebH,O_WN_SENSE,&sense);
    return(sense.buf);
    }

GLDEF_C INT hEBSetText(VOID *ebH,TEXT *pb,INT blen)
    {
    SE_EDWIN set;

    set.buf=pb;
    set.len=blen;
    return(Entersend(ebH,O_WN_SET,&set,NULL,NULL));
    }

GLDEF_C VOID hEBEmphasise(VOID *ebH,INT flag)
    {
    p_send3(ebH,O_WN_EMPHASISE,flag);
    }

GLDEF_C INT hEBSetSelect(VOID *ebH,INT aoff,INT coff)
    {
    SET_EDWIN set;

    set.flags=SET_EDWIN_CURSOR|SET_EDWIN_ANCHOR;
    set.anchor=aoff;
    set.cursor=coff;
    return(Entersend(ebH,O_EW_SET,&set,NULL,NULL));
    }

GLDEF_C INT hEBSenseSelect(VOID *ebH,UWORD *top)
    {
    return(p_send3(EebH->edwin.scrimg,O_SI_GET_SELECT,top));
    }

GLDEF_C INT hEBSetClipText(VOID *ebH,TEXT *pb,INT blen)
    {
    return(Entersend(EebH->edwin.clip,O_EP_SET_TEXT,pb,V blen,0));
    }

GLDEF_C TEXT *hEBSenseClipText(VOID *ebH)
    {
    TEXT *pb;

    p_send3(EebH->edwin.clip,O_EF_SENSE_BUF,&pb);
    return(pb);
    }

GLDEF_C INT hEBEvaluate(VOID *ebH)
    {
    return(Entersend(ebH,O_EW_EVALUATE,NULL,NULL,NULL));
    }

GLDEF_C INT hEBChangeWidth(VOID *ebH,INT width)
    {
    P_EXTENT ext;

    p_send3(ebH,O_EW_SENSE_SIZE,&ext);
    EebH->edwin.margins.right+=width-ext.width;
    ext.width=width;
    return(Entersend(ebH,O_EW_SET_SIZE,&ext,NULL,NULL));
    }

GLDEF_C INT hEBSetMargin(VOID *ebH,UINT right)
    {
    INT ret;
    UINT oright;

    oright=EebH->edwin.margins.right;
    EebH->edwin.margins.right=right;
    ret=Entersend(EebH->edwin.scrimg,
                        O_SI_STYLE_CHANGED,SCRIMG_STCHNG_DOC,NULL,NULL);
    if (ret<0)
        EebH->edwin.margins.right=oright;
    return(ret);
    }

GLDEF_C UINT hEBSenseMargin(VOID *ebH)
    {
    return(EebH->edwin.margins.right);
    }

GLDEF_C INT hEBInsert(VOID *ebH,TEXT *pb,INT blen)
    {
    return(Entersend(ebH,O_EW_INSERT,pb,V blen,NULL));
    }

GLDEF_C INT hEBReplace(VOID *ebH,TEXT *replace,INT backwards)
    {
    return(Entersend(ebH,O_EW_REPLACE,replace,V backwards,NULL));
    }

GLDEF_C INT hEBCopy(VOID *ebH)
    {
    if (!(EebH->edwin.select))
        return(1);
    return(Entersend(ebH,O_EW_REPLACE_CLIP,NULL,NULL,NULL));
    }

GLDEF_C INT hEBPaste(VOID *ebH)
    {
    if (!(p_send2(EebH->edwin.clip,O_EP_SENSE_LEN)))
        return(1);
    return(Entersend(ebH,O_EW_PASTE_CLIP,NULL,NULL,NULL));
    }

GLDEF_C INT hEBFind(VOID *ebH,TEXT *str,INT flags)
    {
    return(p_send4(ebH,O_EW_FIND,str,flags));
    }

GLDEF_C INT hEBSenseChanged(VOID *ebH)
    {
    return(EebH->edwin.change);
    }

GLDEF_C VOID hEBClearChanged(VOID *ebH)
    {
    EebH->edwin.change=FALSE;
    }

GLDEF_C VOID hEBSetCWidth(VOID *ebH,INT cwidth)
    {
    SCRIMG_WIN win;

    p_send3(EebH->edwin.scrimg,O_SI_SENSE,&win);
    win.cwidth=cwidth;
    Entersend(EebH->edwin.scrimg,O_SI_SET,&win,NULL,NULL);
    }


GLDEF_C INT hEBShowSymbols(VOID *ebH,INT flag)
    {
    SCRLAY_STYLE style;

    p_send3(EebH->edwin.scrlay,O_SL_SENSE,&style);
    style.options=FALSE;
    if (flag)
        style.options=SCRLAY_SHOW_SPACES|SCRLAY_SHOW_LFS;
    p_send3(EebH->edwin.scrlay,O_SL_SET,&style);
    return(Entersend(EebH->edwin.scrimg,O_SI_STYLE_CHANGED,0,0,0));
    }

GLDEF_C VOID *hEBOpen(INT flags,H_EDIT_BOX *heb)
    {
    VOID *ebH;
    IN_EDWIN in;
    IN_EDWIN_X inx;
    PR_WIN win;

    ebH=uCheckHandle(p_new(CAT_HWIF_HWIM,C_EDWIN));
    if (!ebH)
        return(NULL);
    win.win.id=heb->win;
    in.vulen=heb->vulen;
    in.flags=flags|IN_EDWIN_VULEN_PIXELS
                        |IN_EDWIN_NO_AUTOSELECT|IN_EDWIN_POSITION_SUPPLIED;
    in.maxlen=heb->maxchars;
    in.contents[0]=0;
    inx.vislines=heb->vislines;
    inx.pos=heb->pos;
    inx.font=heb->font;
    inx.style=heb->style;
    inx.leading.total=heb->lead_tot;
    inx.leading.top=heb->lead_top;
    inx.clip=NULL;
    if (Entersend(ebH,O_WN_INIT,&in,&win,&inx))
        {
        hEBClose(ebH);
        return(NULL);
        }
    return(ebH);
    }

GLDEF_C VOID *hEBSenseDoc(VOID *ebH)
    {
    return(EebH->edwin.doc);
    }

GLDEF_C INT hEDCapacity(VOID *doc,UINT maxlen)
    {
    return(Entersend(doc,O_EP_CAPACITY,V (maxlen+1),NULL,NULL));
    }

GLDEF_C INT hEDInsert(VOID *doc,UINT pos,VOID *buf,UINT len)
    {
    return(Entersend(doc,O_EP_INSERT,V pos,buf,V len));
    }

GLDEF_C INT hEBDocChanged(VOID *ebH)
    {
    UINT doclen;

    doclen=p_send2(EebH->edwin.doc,O_EP_SENSE_LEN);
    EebH->edwin.clen=doclen+1;
    return(Entersend(EebH->edwin.scrimg,O_SI_DOC_CHANGED,V doclen,NULL,NULL));
    }

GLDEF_C INT hEBPosToXL(void *ebH,H_SCRLAY_PLX *plx)
    {
    return(p_send3(EebH->edwin.scrlay,O_SL_POS_TO_XL,plx));
    }
